// 模拟实现字符串函数
#include<stdio.h>
#include<assert.h>
size_t my_str_len(const char* str)
{
	assert(str);
	int count = 0;
	while (*(str + count++) != '\0');
	return count - 1;
}

char* my_str_cpy(char* str, const char* str1)
{
	assert(str && str1);
	int i = 0;
	for (i = 0; *(str1 + i) != '\0'; i++)
	{
		*(str + i) = *(str1 + i);
	}
	*(str + i) = '\0';
	return str;
}
char* my_str_cat(char* str, const char* str1)
{
	assert(str && str1);

	int len = 0;
	while (*(str + len++) != '\0');
	len--;
	//while (*str1)
	//{
	//	
	//	len++;
	//	str1++;
	//}
	//*(str + len) = *str1;
	while (*(str + len++) = *str1++);		// 化简
	return str;
}
int my_str_cmp(char const* str, char const* str1)
{
	assert(str && *str1);
	// 单个字符进行比较
	for (int i = 0; *(str + i) != '\0' || *(str1 + i) != '\0'; i++)
	{
		if (*(str + i) > *(str1 + i) || *(str + i) < *(str1 + i))
			return *(str + i) - *(str1 + i);
	}
	// 既不大于也不小于所以相等
	return 0;
}

// 长度受限制的字符串函数
// strncpy
// strncat
// strncmp
char* my_str_ncpy(char* str, const char* str1, size_t num)
{
	int len = 0;
	while (*(str1 + len) != '\0')
		len++;

	// 只拷贝前num个字符
	for (int i = 0; i < num; i++)
	{
		if (i < len)
			*(str + i) = *(str1 + i);
		else
			*(str + i) = '\0';
	}
	return str;
}
char* my_str_ncat(char* str, const char* str1, size_t num)
{
	int lenstr = 0;
	while (*(str + lenstr) != '\0')
		lenstr++;

	int lenstr1 = 0;
	while (*(str1 + lenstr1) != '\0')
		lenstr1++;

	// 只追加前num个字符
	for (int i = 0; i < num; i++)
	{
		if (i < lenstr1)
			*(str + lenstr++) = *(str1 + i);
	}
	*(str + lenstr) = '\0';
	return str;
}
char* my_str_ncmp(char* str, const char* str1, size_t num)
{
	// 只比较前num个字符
	for (int i = 0; i < num; i++)
	{
		if (*(str + i) > *(str1 + i))
			return 1;
		else if (*(str + i) < *(str1 + i))
			return -1;

	}
	return 0;
}
// 复杂↓
char* my_str_str(const char* str, const char* str1) // 查找子串
{
	char* str3 = str;
	int i = 0;
	// "abbbcdef";
	// "bbc";
	// 多重匹配
	while (*str != '\0')
	{
		if (*str != *str1)
			str++;
		else
		{
			i = 0;
			str3 = str + 1;
			do
			{
				str++;
				i++;
				if (*(str1+i) == '\0')
					return str3 - 1;
			} while (*(str1+i) == *str);
			str = str3;
		}
	}
	return NULL;
}

// strtok 字符串切割
// 使用技巧
//int main()
//{
//	const char* sep = "@.";
//	char email[] = "zhangpengwei@@bitejiuyeke.com";
//	char cp[30] = { 0 };
//	strcpy(cp, email);
//
//	//char* ret = strtok(cp, sep);
//	//printf("%s\n", ret);
//
//	//ret = strtok(NULL, sep);
//	//printf("%s\n", ret);
//
//	//ret = strtok(NULL, sep);
//	//printf("%s\n", ret);
//
//	//ret = strtok(NULL, sep);
//	//printf("%s\n", NULL);
//
//	for (int ret = strtok(cp, sep); ret; ret = strtok(NULL, sep))
//		printf("%s\n", ret);
//
//	return 0;
// }

// C语言的库函数，在执行失败后都会自动设置错误码
// strerror  //错误码所对应的错误信息（字符串）的首地址
//int main()
//{
//	printf("%s\n", strerror(0));
//	printf("%s\n", strerror(1));
//	printf("%s\n", strerror(2));
//	printf("%s\n", strerror(3));
//	printf("%s\n", strerror(4));
//	// C语言设置的一个全局的错误码存放的变量
//	FILE* ret = fopen("text.txt", "r");
//	if (ret == NULL)
//		printf("%s\n", strerror(errno));
//	return 0;
//}